package com.lanqiao.controller;

import com.lanqiao.domain.District;
import com.lanqiao.domain.House;
import com.lanqiao.domain.Street;
import com.lanqiao.service.IHouseService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * @author 张建平 on 2020/8/12.
 */
@Controller
@RequestMapping("/house")
@SessionAttributes({"condition"})
public class HouseController {

    static Logger logger = Logger.getLogger(HouseController.class);

    @Autowired
    IHouseService houseService;

    @RequestMapping("/search")
    public String search(House condition, Integer pageNum, ModelMap modelMap, HttpSession session) {
        // 只要请求参名和<input name="title"> condition对象的属性名相同springmvc就会自动将参数值封装进去
        logger.debug(condition);

        // 表示用户点击查询按钮
        if (pageNum == null) {
            // 保留查询条件 到session
            modelMap.addAttribute("condition", condition);
            pageNum = 1; // 默认查询第一页
        } else {
            // 表示用户点击的是 分页 链接, 则将原来保留的条件从Session取回
            condition = (House) session.getAttribute("condition");
        }

        /*
        这个list可转换成pagehelper库的com.github.pagehelper.Page<House>对象，此Page定义为：
            public class Page<E> extends ArrayList<E> implements Closeable {
            }
        它其实就是一个列表，Page包下面这些信息，更多可查它的源码
         */
        List<House> houseList = this.houseService.find(condition, pageNum, 3); // 后两个参数是页号、每页记录数

        modelMap.addAttribute("page", (com.github.pagehelper.Page<House>)houseList);

        return "list"; // /views/list.jsp
    }

    /**
     * 查询所有区县
     * @return
     */
    @RequestMapping("/loaddistrict")
    @ResponseBody  // 让springmvc将列表转换成JSON
    public List<District> loadDistrict() {
        List<District> list = houseService.loadDistrict();
        return list;
    }

    /**
     * 查询指定区县的街道
     * @return
     */
    @RequestMapping("/loadstreet")
    @ResponseBody
    public List<Street> loadStreet(@RequestParam("districtId") Integer id) { // 只请求参数名与方法的形参名字一样springmvc就会自动注入参数值
        List<Street> list = this.houseService.loadStreet(id);
        return list;
    }

    @RequestMapping("/detail/{id}")
    public String viewDetail(@PathVariable Integer id, ModelMap modelMap) {
        // @PathVariable的作用：将路径变量id的仠注入给方法参数id，当路径变量名与方法参数名不一样时需要在@PathVariable("路径变量名")中指定路径变量名

        logger.debug("House ID: " + id);

        House house = houseService.findById(id);

        modelMap.addAttribute("h", house);
        return "detail"; // forward to /views/detail.jsp
    }


    /**
     * @param house
     * @return
     */
    @RequestMapping(value = {"/add", "/insert"},method = {RequestMethod.POST})
    public String addHouse(House house) {
        /*
          method = {RequestMethod.POST,RequestMethod.GET,....} 表示该方法可处理哪些请求方式

         前后端分离开发时对url的设计很重要：
         rest api: 种软件架构风格、设计风格，而不是标准.
         通过请求方式与url编写出供前端调用的API, 这种编程方式称: restFUL API
         GET:
         查询所有：/house
         查询指定ID：/house/1

         POST:
         添加：/house

         PUT:
         更新: /house

         DELETE:
         删除: /house
        */
        logger.debug(house);

        this.houseService.save(house);


        return "redirect:/house/search"; // 重定向到列表页
    }

}
